<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>

  <script>
    /* 
    1. slice 方法：返回一个新的数组对象，这一对象是一个由 begin 和 end 决定的原数组的浅拷贝（包括 begin，不包括end）。原始数组不会被改变。
    2. concat() 方法用于合并两个或多个数组。此方法不会更改现有数组，而是返回一个新数组。
   */

    let arr = [1, 2, 7, 3, 4, 5, 6];
    // 数组的 slice 方法
    Array.prototype.slice = function (begin, end) {
      // 返回结果的初始值
      let arr = [];
      // 如果传入的begin为负数并且不传入end，那么就从最后截取相应的数值
      if (begin < 0) {
        if (end) {
          return arr
        }
        begin = this.length - -begin;
        end = this.length;
      } else {
        // 如果只传入 begin， 那么end应该等于length
        end = end || this.length
        if (end > this.length) {
          end = this.length
        }
      }
      // 遍历原数组
      for (let index = begin; index < end; index++) {
        arr.push(this[index])
      }

      return arr;
    }

    console.log(arr.slice(-4));
    // 数组的 concat 方法
    Array.prototype.concat = function (...args) {
      let arr = [...this];

      args.forEach(arg => {
        // 如果参数为一个数组，就进行结构赋值
        if (Array.isArray(arg)) {
          arr.push(...arg)
        } else if (typeof (arg) === 'number') {
          arr.push(arg)
        }
      })

      return arr;
    }
    console.log(arr.concat(0, 1, 2, [12, 12, 12]))
  </script>
</body>

</html>